home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / msh-156.lha / syslog / syslog.c < prev    next >
C/C++ Source or Header  |  1994-10-24  |  3KB  |  130 lines

  1. /*-
  2.  * $Id: syslog.c,v 1.1 1994/10/24 20:36:30 Rhialto Exp $
  3.  *
  4.  * $Log: syslog.c,v $
  5.  * Revision 1.1  1994/10/24  20:36:30  Rhialto
  6.  * Initial revision
  7.  *
  8.  * DEBUGGING OUTPUT ROUTINES FOR SYSLOG
  9. -*/
  10.  
  11. #ifdef __STDC__
  12. #   include <stdarg.h>
  13. #   include <clib/exec_protos.h>
  14. #endif
  15. #ifndef EXEC_PORTS_H
  16. #   include <exec/ports.h>
  17. #endif
  18. #include "syslog_private.h"
  19. #ifdef __DICE_INLINE
  20. static struct ExecBase *SysBase;
  21. #endif
  22.  
  23. #ifdef __STDC__
  24. Local void putgetmsg(struct LogMsg *msg);
  25. Prototype void initsyslog(void);
  26. Prototype void uninitsyslog(void);
  27. Prototype void syslog(char *format, ...);
  28. #define DOTS ...
  29. #else
  30. #define DOTS dots
  31. typedef void *va_list;
  32. #define va_arg(valist,typename) ((valist = (void *)((char *)valist + sizeof(typename))), (*(typename *)((char *)(valist) - sizeof(typename))))
  33. #define va_start(valist,right)    (valist = (void*)((char *)&right + sizeof(right)))
  34. #define va_end(valist)
  35. #endif
  36.  
  37. #ifdef _DCC
  38. #define INTERFACE_JUNK    __stkargs /*__regargs*/
  39. #define VARIABLE_JUNK    const
  40. #endif
  41.  
  42. #define DISABLE     /* Disable(); */
  43. #define ENABLE        /* Enable(); */
  44.  
  45. VARIABLE_JUNK struct LogPort *LogPort;    /* owned by the logging process */
  46. VARIABLE_JUNK const char PortName[] = "syslog";
  47.  
  48. /*
  49.  * You cannot use DOS functions from within TASKS or in DOS file system
  50.  * handlers or the like. Therefore we send a message to an other
  51.  * PROCESS that does the work for us.
  52.  *
  53.  * In case someone else uses the same signal, we try to restore the
  54.  * signal to what it would have been without our interference.
  55.  */
  56.  
  57.  
  58. static void
  59. putgetmsg(msg)
  60. struct LogMsg *msg;
  61. {
  62.     long        OldSignal;
  63.  
  64.     msg->lm_Msg.mn_ReplyPort = (void *)FindTask(NULL);
  65.     /* Get original state of the signal, and clear it */
  66.     DISABLE();
  67.     OldSignal = SetSignal(0L, DEBUGSIGMASK);
  68.     ENABLE();
  69.     PutMsg(&LogPort->lp_MsgPort, &msg->lm_Msg);
  70.     for (;;) {
  71.     Wait(DEBUGSIGMASK);
  72.     if (msg->lm_Msg.mn_Node.ln_Type == NT_REPLYMSG)
  73.         break;
  74.     /* The signal was not for us, so set it when we're finished */
  75.     OldSignal = DEBUGSIGMASK;
  76.     }
  77.     /* Restore would-have-been state of the signal */
  78.     SetSignal(OldSignal, DEBUGSIGMASK);
  79. }
  80.  
  81. INTERFACE_JUNK
  82. void
  83. initsyslog()
  84. {
  85. #ifdef __DICE_INLINE
  86.     SysBase = *(struct ExecBase **)4;
  87. #endif
  88.     Forbid();
  89.     *(struct MsgPort **)&LogPort = FindPort(PortName);
  90.     if (LogPort) {
  91.     struct LogMsg    logmsg;
  92.  
  93.     logmsg.lm_Msg.mn_Length = SYSLOG_START;
  94.     putgetmsg(&logmsg);
  95.     }
  96.     Permit();
  97. }
  98.  
  99. INTERFACE_JUNK
  100. void
  101. uninitsyslog()
  102. {
  103.     if (LogPort) {
  104.     struct LogMsg    logmsg;
  105.  
  106.     logmsg.lm_Msg.mn_Length = SYSLOG_END;
  107.     putgetmsg(&logmsg);
  108.     LogPort = NULL;
  109.     }
  110. }
  111.  
  112. INTERFACE_JUNK
  113. void
  114. syslog0(format, DOTS)
  115. char           *format;
  116. {
  117.     if (LogPort) {
  118.     va_list     valist;
  119.     struct LogMsg    logmsg;
  120.  
  121.     va_start(valist, format);
  122.     logmsg.lm_Msg.mn_Length = SYSLOG_PRINT;
  123.     logmsg.lm_Format = format;
  124.     logmsg.lm_Args = valist;
  125.  
  126.     putgetmsg(&logmsg);
  127.     va_end(valist);
  128.     }
  129. }
  130.